# 一、定义一个学生Student类。有下面的类属性：
# 1 姓名 name
# 2 年龄 age
# 3 成绩 score（语文，数学，英语) [每课成绩的类型为整数]
# 类方法：
#  1 获取学生的姓名：get_name() 返回类型:str
# 2 获取学生的年龄：get_age() 返回类型:int
# 3 返回3门科目中最高的分数。get_course() 返回类型:int
# 4 将每个实例学生对象写进student1.txt文件里，要持久保存
# 举例：{"姓名":"a","年龄":29,"成绩":{"语文":99,"数学":100,"英语":85}
# 5 获取所有学生的信息
# 写好类以后，可以定义2个同学测试下:
# zm = Student('zhangming',20,[69,88,100])

from faker import Faker
'''

class Student:
    # 初始化对象实例
    def __init__(self, name, age, chinese, math, english):
        self.name = str(name)
        self.age = int(age)
        self.chinese = int(chinese)
        self.math = int(math)
        self.english = int(english)
        with open('student1.txt', 'a', encoding='utf-8') as f:
            if self.name in f.read():
                pass
            else:
                with open('student1.txt', 'a', encoding='utf-8') as f:
                    f.write(
                        "{\"姓名\":\"" + self.name + "\",\"年龄\":" + str(self.age) + ",\"成绩\":{\"语文\":" + str(
                            self.chinese) + ",\"数学\":" + str(self.math) + ",\"英语\":" + str(self.english) + "}}\n"
                    )


    def get_name(self):
        return self.name

    def get_age(self):
        return self.age

    def get_course(self):
        max_course = self.chinese
        if max_course < self.math:
            max_course = self.math
        if max_course < self.english:
            max_course = self.english
        return max_course

    def wr_student(self):
        with open('student1.txt', 'r', encoding='utf-8') as f:
            count = f.read()
            return count


zm = Student('zhangming', 20, 69, 88, 100)
# print(zm.wr_student())
# print(zm.get_course())
ll = Student('liuh', 18, 98, 39, 100)
# print(ll.wr_student())
# print(ll.get_course())

'''
# 二、定义一个字典类：dictclass。完成下面的功能：
# 1 删除某个key
# 2 判断某个键是否在字典里(key in 字典)，如果在返回键对应的值，不存在则返回"not found"
# 3 返回键组成的列表：返回类型;(list)
# 4 合并字典，并且返回合并后字典的values组成的列表。返回类型:(list)
import random
from datetime import time


'''
class dictclass:
    def __init__(self, dict1):
        self.dict1 = dict1

    # 第一题思路
    def shanchu(self, keys):
        if keys in self.dict1:
            print(self.dict1)
            self.dict1.pop(keys)
            print(self.dict1)
        else:
            return "Key not found"
        return self.dict1

    # 第二题思路
    def pf(self, keys):
        if keys in self.dict1:
            aa = self.dict1.get(keys)
            return aa
        else:
            return "not found"

    # 第三题思路
    def re_list(self):
        list1 = []
        for i in self.dict1.keys():
            list1.append(i)
        return list1

    def hebing(self, dicts1, dicts2):
        dicts1.update(dicts2)
        return dicts1


#
dict1 = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5, "f": 6, "g": 7, "h": 8}
a1 = dictclass(dict1)
result = a1.shanchu('a')
a2 = dictclass(dict1)
result2 = a2.pf('h')
print(result2)
a3 = dictclass(dict1)
result3 = a3.re_list()
print(result3)
dict2 = {'name': '周周', 'age': 18}
dict3 = {'name': 'longzai', 'age': 18, 'job': 'programmer'}

a4 = dictclass({})
# 问题：为什么不能把2追加到3
result4 = a4.hebing(dict1,dict3)
print(result4)
'''

# 四、定义一个列表的操作类：Listinfo
# 包括的方法:
# 1 列表元素添加: add_key(keyname) [keyname:字符串或者整数类型]
# 2 列表元素取值：get_key(num) [num:整数类型]
# 3 列表合并：update_list(list) [list:列表类型]
# 4 删除并且返回最后一个元素：del_key()
'''
class Listinfo:
    def __init__(self, list1):
        self.list1 = list1

    def add_key(self, *keyname):
        self.list1.extend(keyname)
        return self.list1

    def get_key(self, num):
        return self.list1[num-1]

    def update_list(self, list_f):
        global result
        a = list(self.list1)
        for i in list_f:
            a.append(i)
        return a

    def del_key(self):
        a = list(self.list1)
        #看到最后一位是888
        print(a)
        result = a.pop()
        return result


r1 = Listinfo([1, 2, 3])

result8 = r1.add_key(213,888)
print(result8)
result9 = r1.get_key(1)
print(result9)
result10 = r1.update_list([99,88,77])
print(result10)
result11 = r1.del_key()
print(result11)
'''
#  五、做一个学生点名系统，系统里支持：存入学生、更改学生、删除学生、点到学生姓名方法
# 存入学生（姓名、年龄、家庭地址、手机号）： 存入成功后，提示xxx存入成功
# 更改学生（姓名、年龄、家庭地址、手机号）：可以修改学生内容的任意一个字段
# 删除学生：删除的学生将不在展示
# 展示全部学生：可以看到全部的学生姓名
# 学生姓名：随机抽取任意一个存在的学生信息，然后打印：到！。举例： 刘闯到！
'''

def student_name():
    print("====================")
    print("学生点名系统\n1.存入学生\n2.更改学生\n3.删除学生\n4.点到学生姓名\n")
    print("====================")
    try:
        a = int(input("请输入选项:"))
    except ValueError:
        print("请输入有效数字：")
    if a == 1:
        add()
    elif a == 2:
        modify()
    elif a == 3:
        delete()
    elif a == 4:
        dao()
def show():
    with open("student2.txt", 'r', encoding='utf-8') as f:
        f.read()
def add():
    name = input("请输入姓名：")
    age = input("请输入年龄：")
    address = input("请输入地址：")
    phone = input("请输入手机号：")
    with open("student2.txt", 'a', encoding='utf-8') as f:
        f.write("姓名为：" + name + ",年龄为：" + age + ",地址为：" + address + ",手机号："+phone+"\n")
    print(f"姓名为{name}存入成功")
    show()
    student_name()
def modify():
    with open("student2.txt", 'r', encoding='utf-8') as f:
        print(f.read())
    a = input("请输入要修改的学生姓名：")
    with open("student2.txt", 'r', encoding='utf-8') as f:
        all_data = f.read()
        if a in all_data:
                print(all_data)
                input_data = input("请输入要修改的学生信息：")
                modify_data = all_data.replace(a, input_data)
                with open("student2.txt", 'wt', encoding='utf-8') as f:
                    f.write(modify_data)
                with open("student2.txt", 'r', encoding='utf-8') as f:
                    print(f.read())
        else:
                print("输入不正确，请重新输入！")
        show()
        student_name()
def delete():
    with open("student2.txt", 'r', encoding='utf-8') as f:
        all_data = f.read()
        print(all_data)
        #检查学生姓名是否存在
        a = input("请输入要删除的学生姓名：")
        if a in all_data:
            input_data = input(f"请输入要修改的{a}学生信息")
            modified_data = all_data.replace(a,input_data)
            with open("student2.txt", 'wt', encoding='utf-8') as f:
                f.writelines(modified_data)
            with open("student2.txt", 'r', encoding='utf-8') as f:
                print(f.read())
        else:
            print("输入不正确，请重新输入！")
    show()
def dao():
    pass

student_name()
'''
# 六、点餐管理系统(研究
# 1》、餐馆可以新增菜品、下架菜品、修改菜品
# 2》、每个菜品，都有对应的库存，所有菜品的库存均为999，每出一道菜，库存-1
# 菜品有对应的价格，餐厅老板定义价格每道菜不允许超过15元，没有小数单位，均为整数
# 3》、餐馆后台有点赞系统，能够收集客户对菜品的喜好，0~5分
# 4》、有菜品评分提报功能，对平均分数（菜品总分/打分人 数）低于3分的菜品进行强制下架；
'''
class Restaurant:
    def __init__(self):
        self.menu = {}  # 菜品信息存储在字典中，键为菜品名，值为菜品信息字典
        self.scores = {}  # 菜品评分信息，键为菜品名，值为评分列表

    def add_dish(self, name, price):
        if name not in self.menu:
            if price <= 15 and price > 0:
                self.menu[name] = {'price': price, 'stock': 999}
                self.scores[name] = []
                return f"{name} 新增成功"
            else:
                return "价格不合法，每道菜的价格应在1到15之间"
        else:
            return f"{name} 已存在"

    def remove_dish(self, name):
        if name in self.menu:
            del self.menu[name]
            del self.scores[name]
            return f"{name} 下架成功"
        else:
            return f"{name} 不存在"

    def update_dish(self, name, price):
        if name in self.menu:
            if price <= 15 and price > 0:
                self.menu[name]['price'] = price
                return f"{name} 修改成功"
            else:
                return "价格不合法，每道菜的价格应在1到15之间"
        else:
            return f"{name} 不存在"

    def order_dish(self, name):
        if name in self.menu and self.menu[name]['stock'] > 0:
            self.menu[name]['stock'] -= 1
            return f"{name} 下单成功"
        else:
            return f"{name} 无库存"

    def rate_dish(self, name, score):
        if name in self.menu and 0 <= score <= 5:
            self.scores[name].append(score)
            return f"{name} 打分成功"
        else:
            return "打分失败，菜品不存在或分数不在合法范围内"

    def check_and_remove_low_rated_dishes(self, threshold=3):
        for name, scores in self.scores.items():
            if scores and sum(scores) / len(scores) < threshold:
                self.remove_dish(name)
                print(f"菜品 {name} 平均评分低于 {threshold} 分，已下架")

# 示例使用
restaurant = Restaurant()

print(restaurant.add_dish("宫保鸡丁", 12))
print(restaurant.add_dish("鱼香肉丝", 14))
print(restaurant.add_dish("红烧牛肉面", 18))  # 价格不合法

print(restaurant.update_dish("宫保鸡丁", 15))
print(restaurant.update_dish("麻辣烫", 16))  # 价格不合法

print(restaurant.order_dish("宫保鸡丁"))
print(restaurant.order_dish("宫保鸡丁"))

print(restaurant.rate_dish("宫保鸡丁", 4))
print(restaurant.rate_dish("宫保鸡丁", 3))

restaurant.check_and_remove_low_rated_dishes()

print("当前菜单：", restaurant.menu)

'''
#  七、定义一个桌子类（Desk），包含长（length）、宽（width）、高（height）属性，
# 包含一个打印桌子信息属性的方法（showInfo）。实例化2个桌子对象，为其赋予不同的属性值，
# 并调用showInfo方法，输出每个桌子的信息。
'''
class Desk:
    def __init__(self,length, width, height):
        self.length = length
        self.width = width
        self.height = height
    def showInfo(self):
        print(f"桌子长为{self.length},宽为{self.width}，高为{self.height}")

desk1 = Desk(120,80,75)
desk2 = Desk(173,98,23)

desk1.showInfo()
desk2.showInfo()

'''
# 八、定义一个用户类(User),用户名(username)和密码(password)是这个类的属性。
'''
class User:
    def __init__(self, username, password):
        self.username = username
        self.password = password

    def pu(self):
        return f"用户名为：{self.username},密码为：{self.password}"


sult = User("admin", 123456)
print(sult.pu())
'''


# 九、定义一个计算器类，有加减乘除四个方法'''
'''
class Calculator:
    def __init__(self,a,b):
        self.a = a
        self.b = b

    def add(self):
        return self.a + self.b
    def sub(self):
        return self.a - self.b
    def mul(self):
        return self.a * self.b
    def exc(self):
        return self.a / self.b
result111 = Calculator(5,6)
print(result111.add())
print(result111.sub())
print(result111.mul())
print(result111.exc())
'''
# 十、创建一个名为Person的类，具有以下属性和方法：
# 属性：name（姓名），age（年龄）
# 方法：greet()，打印出一句问候语，包括该人的姓名和年龄
'''
class Person:
    def info(self,name = "jiac",age = 19):
        self.name = name
        self.age = age
    def hello(self):
        print(f"姓名为{self.name},年龄为{self.age}")
return103 = Person()
return103.info()
return103.hello()
'''
# 十一、定义一个图书管理系统类，图书可以新增、修改、删除，要求新增的每个图书都加到txt文本里，数据持久化
# 新增：图书名、作者名称、新建年月日
# 修改：图书名、作者名称、新建年月日
# 删除：图书删掉，且不在展示
# 查看：全量查询，精确查询，需要用户传入形参来控制返回结果
class LibraryManage:

    def add_book(self,book_name,author,year1):
        with open("book.txt",'a',encoding='utf-8') as f:
            f.write(f"图书名：{book_name},作者名称：{author},新建年月日：{year1}\n")

    def modify_book(self, old_book_name, new_book_name, new_author, new_year):
        with open("book.txt", 'r', encoding='utf-8') as f:
            lines = f.readlines()

        with open("book.txt", 'w', encoding='utf-8') as f:
            for line in lines:
                if old_book_name in line:
                    line = line.replace(f"图书名：{old_book_name}", f"图书名：{new_book_name}")
                    line = line.replace(line.split(',')[1], f" 作者名称：{new_author}")
                    line = line.replace(line.split(',')[2], f" {new_year}\n")
                f.write(line)

    def del_book(self):
        book_to_delete = input("请输入要删除的图书名：")
        with open("book.txt", 'r', encoding='utf-8') as f:
            lines = f.readlines()

        with open("book.txt", 'w', encoding='utf-8') as f:
            for line in lines:
                if f"图书名：{book_to_delete}" not in line:
                    f.write(line)

    def look_book(self):
        with open("book.txt", 'r', encoding='utf-8') as f:
            a=f.read()
            print(a)
result = LibraryManage()
result.add_book("红楼梦1","李雪琴1","2000年4月9日")
result.add_book("红楼梦2","李雪琴2","2000年4月9日")
result.modify_book("红楼梦2","西游记","罗贯中","2000年4月9日")
result.look_book()
result.del_book()
# 十二、创建一个名为"Car"的类，该类具有"品牌"和"颜色"属性。
# 创建一个"start_engine"方法，该方法打印出"启动汽车引擎！"的消息。
# 创建一个"stop_engine"方法，该方法打印出"关闭汽车引擎！"的消息
'''
def __init__(self, brand, color):  # 品牌brand   颜色color
    self.brand = brand  # “start_engine”方法来打印出“启动汽车引擎！”
    self.color = color  # 作为构造函数来初始化品牌和颜色属性,它在调用时会打印出相应的消息。


def start_engine(self):
    print("启动汽车引擎！")


def stop_engine(self):
    print("关闭汽车引擎！")


'''


# 十三、淘宝商家后台，可以上架商品、下架商品，功能如下：
#  （1） 可以添加商品，商家添加完的商品会存到商品列表
#  1.1  商品要有名称、sku、价格
#  （2） 可以修改商品信息：名称、sku、价格
#  （3） 可以对商品进行下架，下架后的商品不再展示

# 十四、定义一个人类
# 1.小明和小美都爱跑步
# 2.小美体重45.0公斤
# 3.小明体重75.0公斤
# 4.每次跑步都会减少0.5公斤
# 5.每次吃东西都会增加1公斤

# 十五、士兵瑞恩有一把ak47
# 士兵可以开火（开火扣动的是扳机）
# 枪能够发射子弹（把子弹打出去）
# 抢能够装子弹–增加子弹数量
# 要求没子弹，需要输出没有子弹了，且发射失败
